package thread;

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

/**
 * 字段更新器的测试。
 */
public class AtomicIntegerFieldUpdaterTest {

    //必须是 volatile修饰的变量才能使用原子字段更新器，否则会报错。
    private volatile int field;

    public static void main1(String[] args) {
        //获取一个原子Integer的更新器，类是【AtomicIntegerFieldUpdaterTest】，字段名为【field】。
        AtomicIntegerFieldUpdater fieldUpdater =AtomicIntegerFieldUpdater.
                newUpdater(AtomicIntegerFieldUpdaterTest.class, "field");

        AtomicIntegerFieldUpdaterTest test5 = new AtomicIntegerFieldUpdaterTest();
        //可以使用这个字段更新器，来进行CAS操作。
        fieldUpdater.compareAndSet(test5, 0, 10);
        // 修改成功 field = 10
        System.out.println(test5.field);
        // 修改成功 field = 20
        fieldUpdater.compareAndSet(test5, 10, 20);
        System.out.println(test5.field);
        // 修改失败 field = 20
        fieldUpdater.compareAndSet(test5, 10, 30);
        System.out.println(test5.field);
    }

    //看下引用类型。
    private volatile Object object;

    public static void main(String[] args) {
        AtomicReferenceFieldUpdater<AtomicIntegerFieldUpdaterTest,Object> updater = AtomicReferenceFieldUpdater.
                newUpdater(AtomicIntegerFieldUpdaterTest.class,Object.class,"object");

        AtomicIntegerFieldUpdaterTest test = new AtomicIntegerFieldUpdaterTest();
        Object o1 = new Object();
        //两次都成功了，第一次是因为，初始化的Object为null。
        System.out.println(updater.compareAndSet(test, null, o1));
        System.out.println(updater.compareAndSet(test, o1, new Object()));

    }

}
